package com.tbit.uqbike.client.dao.core;

import com.tbit.uqbike.client.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 用户dao
 *
 * @author Leon
 * 2017年2月24日 下午4:02:36
 */
public interface UserDao {
    /**
     * 添加
     *
     * @param user
     */
    void insert(User user);

    /**
     * 用户
     *
     * @param params
     * @return
     */
    User getByAccountIdAndPhone(Map<String, Object> params);

    /**
     * 根据用户id查询
     *
     * @param userId
     * @return
     */
    User getByUserId(Integer userId);

    /**
     * 更新
     *
     * @param user
     */
    void update(User user);

    /**
     * 更新押金支付状态
     *
     * @param params
     */
    void updateDeposit(Map<String, Object> params);

    /**
     * 更新账户金额
     *
     * @param params
     */
    void updateMoney(Map<String, Object> params);

    /**
     * 更新押金金额
     *
     * @param params
     */
    void updateDepositMoney(Map<String, Object> params);

    /**
     * 实名认证
     *
     * @param params
     */
    void updateNameAuth(Map<String, Object> params);

    /**
     * 更新免押会员到期日期
     *
     * @param params
     */
    void updateDepositDate(Map<String, Object> params);

    /**
     * 导入别的平台数据
     *
     * @param user
     */
    void insertOther(User user);

    List<User> getByNO(@Param(value = "idNO") String idNO);

    List<User> getByIdNOAndId(Map<String, Object> params);

    void editSex(Integer userId);

    /**
     * 修改学生认证信息
     *
     * @param user
     */
    void updateStudentAuth(User user);

    /**
     * 修改扣款金额
     *
     * @param user
     */
    void updateRideMoney(User user);

    /**
     * 获取用户骑行分
     *
     * @param userId
     * @return
     */
    Integer getUserRidingScore(@Param("userId") Integer userId);

    /**
     * 修改用户骑行分
     *
     * @param userId
     * @param ridingScore
     */
    void updateUserRidingScore(@Param("userId") Integer userId, @Param("ridingScore") Integer ridingScore);

    /**
     * 获取用户id
     *
     * @param idNO      身份证
     * @param accountId 品牌
     * @return
     */
    List<Integer> getUserIdByIdNo(@Param("idNO") String idNO, @Param("accountId") Integer accountId);

    int authStudentStatus(@Param("studentIdNo") String studentIdNo, @Param("updateTime") String updateTime, @Param("userId")Integer userId);
    /**
     * 根据身份证号查询是否有欠费 (true=欠费，false=无欠费)
     * @param accountId 品牌id
     * @param idNO 身份证号码
     */
    boolean checkArrearsByIdNO(@Param("accountId") Integer accountId, @Param("idNO") String idNO);

    /**
     * 获取用户注销次数
     * todo 为了命中联合索引 ， 只查询country为中国 86 的 ， 实际系统也没接入国外手机号
     * @param accountId 品牌
     * @param phone 用户手机号
     * @param nearlyYear 是否查询近一年
     * @return 次数
     */
    Integer getCountByAccountIdAndPhone(@Param("accountId") Integer accountId,@Param("phone") String phone,@Param("nearlyYear") Boolean nearlyYear);

    /**
     * 更新所有非空字段
     * @param user
     */
    void updateAll(@Param("user") User user);

    /**
     * 根据品牌id获取有配置共享实名认证的其它品牌的已实名的用户，取更新时间最新的用户
     *
     * @param brandIds 品牌id集合
     * @param phone    手机号
     * @return
     */
    User getByShareBrandAndHasNameAuth(@Param("brandIds") List<Integer> brandIds, @Param("phone") String phone);

    /**
     * 当前品牌与其他品牌有配置共享的所有品牌id
     *
     * @param brandId
     * @return
     */
    List<Integer> getBrandIdsByShareConfig(@Param("brandId") Integer brandId);

    /**
     * 更新用户金额为一个值
     * @param userId 用户id
     * @param money 金额（单位：分）
     * @param time 时间
     */
    void updateUserMoney(@Param("userId") Integer userId, @Param("money") Long money, @Param("time") Date time);
}